4chan_sciencefandomcom-20200214-history
Computer Science and Engineering
Fundamentals In order to have a solid CS&E foundation, you should touch upon each of the following fundamental topics Basic Programming & Data Structures It's hard to recommend introductory books for this as people tend to have varying goals and languages they are interested in learning to offer one size fits all recommendations. As general advice, don't start learning too many languages at once before you have a solid grasp of one, say C++, to act as a frame of reference. You should also be aware that most material in this list and in general will assume that you know or are familiar with C++ or at least C. Possible books to look into if you want to start with C++ would be: * C++ Primer Plus by Prata (Very basic introduction for absolute first timers that want a gentle intro) * C++ Primer by Lippman, Lajoie, and Moo (Works as a follow up to Primer Plus or as a first book on C++ with some prior programming experience) * Programming: Principles and Practice Using C++ by Stroustrup (Written by the creator of C++. Works as an alternative to the Primer books as an excellent introduction to programming and to C++) I cannot stress this enough: Even if all you were looking for is to learn how to code, once you've mastered the syntax of programming (such as with the books above) you must never stop there and continue on to studying the structure, implementation, and analysis of common data structures (and the basic algorithms that go with them). This is utterly essential for fully grasping programming and for coding any program with even an ounce of complexity to it (i.e. any useful program whatsoever). You do not know any programming until you've done so. * Data Structures and Algorithms in C++ by Drozdek For additional references on advanced topics in C++: * The C++ Standard Library: A Tutorial and Reference by Josuttis * Effective C++: 55 Specific Ways to Improve Your Programs and Designs by Scott Meyers * Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14 by Scott Meyers * The C++ Programming Language by Stroustrup Other programming materials can be found on the Programming Textbook Recommendations page Learn your way around an Unix shell, Make, and C Assuming you don't know them already that is. If you know the basics of C++, learning C distills down to learning what you can't do anymore and the few quirks where C behaves differently: see C for C++ Programmers for some of the differences. * Advanced Programming in the UNIX Environment by Stevens and Rago * Make Manual * The C Programming Language by Kernighan and Ritchie (known as K&R, but beware it was published in 1988 and the C language has changed with C99 and C11 standards) * C Programming: A Modern Approach by King Computer Architecture and Digital Logic Digital Logic * Fundamentals of Logic Design by Roth & Kinney * Digital Design: Principles and Practices by Wakerly Computer Organization and Architecture * Computer Organization and Design: The Hardware/Software Interface by Patterson & Hennessy * Computer Systems: A Programmer's Perspective by Bryant & O'Hallaron * Computer Architecture: A Quantitative Approach by Hennessy & Patterson (The order of their names differentiates between their 2 books, this one is more advanced) Operating Systems * Operating System Concepts by Silberschatz (The Dinosaur book) * Modern Operating Systems by Tanenbaum For more see the OS Development section Mathematics Primer To study algorithms, compilers, complexity theory, and advanced topics you'll need some familiarity with abstract topics such as proofs, sets, number theory, combinatorics, graph theory, and probability. But the good (or bad) news is that you don't need that much depth in most of these area at the beginning of your studies so you don't have to worry about fully mastering them all at once. Eventually, you will want to dive deeper and resources for that are provided in the Mathematics section. Now is also the best time for you to consider learning LaTeX and practicing typesetting most of your work in it. The most important topics you absolutely want to fully grasp here is reading and writing proof, logical expression, and naive set theory. Sadly, even majors who take courses on discrete mathematics still find that proofs totally elude them. You could try to pick up proofs in a discrete math book but you will find yourself lacking in much needed practice. Therefore it's strongly recommend that you study a mathematics oriented exposition on proofs instead. The last thing you want is to do is to be struggling with proofs when you move on to later topics and that will almost guarantee you failure or at least a terrible time. * A Transition to Advanced Mathematics by Smith, Eggen, and Andre * A Primer of Abstract Mathematics by Ash * Conjecture and Proof by Laczkovich (An excellent supplement to the above books and shows a larger variety of proofs in mathematics) * Proofs from THE BOOK by Aigner and Ziegler (Not a textbook on proofs but it is an excellent collection of well done and elegant proofs to appreciate and draw inspiration from) If you still find yourself struggling with proofs, then the following books take a far more hand holding approach through them (but at the cost of excluding some valuable material) * How to Prove It: A Structured Approach by Velleman * Book of Proof by Hammack Now that you can finally reason your way out of a paper bag, there's not much to learn that you couldn't pick up as you go. But to be familiar with the topics ahead of time, these books serve as a crash course (remember that discrete mathematics barely scratches the surface of most topics they cover): * Concrete Mathematics: A Foundation for Computer Science by Graham, Knuth, and Patashnik * Discrete Mathematics and Its Applications by Rosen (level is a bit lower than Graham) There's also the standard requirements that you know Calculus and Linear Algebra so if you haven't already done so go learn about them. One last thing to study at this level is introductory probability which is indispensable for dealing with the real world. * The Art Of Probability by Hamming (Great introduction or supplement to the other probability texts) * Probability by Pitman * A First Course in Probability by Ross * An Introduction to Probability and Random Processes by Rota and Baclawski Algorithms The study of algorithms and their analysis is essential for any serious work in the field * Introduction to Algorithms by Cormen, Leiserson, Rivest, and Stein (Known as CLRS) * Algorithms in C++ Parts 1-5: Fundamentals, Data Structures, Sorting, Searching, and Graph Algorithms by Sedgewick (also available in a C version) * Algorithm Design by Kleinberg and Tardos * An Introduction to the Analysis of Algorithms by Sedgewick and Flajolet and as a reference * The Art of Computer Programming by Knuth Various Programming Languages, Paradigms, and Compilers You should study a few different "feeling" programming languages that operate differently from what you're comfortable with. Common languages people tend to study are: Lisp/Scheme/Racket, Prolog, Haskell, Forth (or Factor), J, Matlab, Python, Lua, C#, and C++. Similarly you should also delve into the study of the structures that these languages have and into the theory of compilers behind their translation into machine instructions * Programming Language Pragmatics by Scot * Engineering a Compiler by Cooper * Compilers: Principles, Techniques, and Tools by Aho (The Dragon book) Automata, Computability Theory, and Complexity Theory One must be aware of the fundamental limits on computing to avoid chasing after the impossible and therefore it is critical to study the theory of computation in depth. * Introduction to the Theory of Computation by Sipser * Theory of Computation by Kozen * Computers and Intractability: A Guide to the Theory of NP-Completeness by Garey and Johnson Special Topics Parallel Programming As computers grow increasingly parallel, it's important to learn how to (and when to) program with OpenMP, MPI, pthreads/std:thread, and OpenCl and be aware of the unique aspects of parallel algorithms from their linear brothers. Good books are hard to find but most recommend these as a general introduction: * An Introduction to Parallel Programming by Pacheco (covers MPI, Pthreads, and OpenMP) * Introduction to Parallel Computing by Grama, Karypis, Kumar, and Gupta (covers MPI, Pthreads, and OpenMP) * C++ Concurrency in Action: Practical Multithreading by Williams (just covers std::thread) * Heterogeneous Computing with OpenCL by Gaster, Howes, Kaeli, et al. (you should be familiar with basic parallel programming before moving on to GPGPU coding) * OpenCL in Action: How to accelerate graphics and computation Scarpino * OpenCL Programming Guide by Munshi, Gaster, et al. Networks * Computer Networks: A Systems Approach by Peterson and Davie * Computer Networks by Tanenbaum * Unix Network Programming, Volume 1: The Sockets Networking API by Stevens * Interconnections: Bridges, Routers, Switches, and Internetworking Protocols by Perlman * Data Networks by Bertsekas and Gallager Information Theory and Coding Theory * Elements of Information Theory by Cover and Thomas * The Mathematical Theory of Communication by Claude Shannon and Warren Weaver (The paper that started it all and is very readable, beautiful, and still useful to read) * Principles of Digital Communication and Coding by Viterbi and Omura * Introduction to Data Compression by Sayood * Information Theory by Ash * Network Information Theory by El Gamal and Kim * Coding and Information Theory by Roman * Information Theory and Reliable Communication by Gallagher Also take a look at MacKay's book in the next section below. AI, Machine Learning, and Computer Vision Warning: most everything people say about it are wild pipe dreams, don't get your hopes up * Artificial Intelligence: A Modern Approach by Russell * Computer Vision by Shapiro and Stockman * Multiple View Geometry in Computer Vision by Richard Hartley * Computer Vision: Algorithms and Applications by Richard Szeliski * Pattern Recognition and Machine Learning by Bishop * Information Theory, Inference & Learning Algorithms by MacKay (Available for free online) Computer Graphics and Image Processing * Digital Image Processing by Gonzalez * Fundamentals of Computer Graphics by Shirley and Marschner * Computer Graphics: Principles and Practice by Hughes, van Dam, McGuire, Sklar, Foley, Feiner, Akeley (updated/rewritten version of the classic CG bible Computer Graphics: Principles and Practice in C by Foley, van Dam, Feiner, and Hughes) Discrete and Computational Geometry * Computational Geometry: Algorithms and Applications by de Berg, Cheong, van Kreveld, and Overmars * Discrete and Computational Geometry by Devadoss and O'Rourke * Lectures on Discrete Geometry by Matousek Combinatorial Optimization, Network Flows, Linear Programming/Optimization, and Approximation Algorithms * Introduction to Linear Optimization by Bertsimas & Tsitsiklis * Theory of Linear and Integer Programming by Schrijver * Network Flows by Ahuja, Magnanti & Orlin * Combinatorial Optimization, Polyhedra and Efficiency by Schrijver * Combinatorial Optimization by Cook * Combinatorial Optimization - Theory and Algorithms by Korte & Vygen * Approximation Algorithms by Vazirani Computer Security and Cryptography * Introduction to Modern Cryptography by Katz and Lindell * Cryptography Engineering: Design Principles and Practical Applications by Niels Ferguson, Bruce Schneier, Tadayoshi Kohno * An Introduction to Mathematical Cryptography by Hoffstein, Pipher, and Silverman Numerical Analysis and Methods * Numerical Methods for Scientists and Engineers by Hamming * Numerical Analysis by Burden * Matrix Computations by Golub and Van Loan * Numerical Linear Algebra by Trefethen and Bau III * Matrix Analysis by Horn and Johnson Computer Algebra Systems and Computer Arithmetic * Modern Computer Algebra von zur Gathen and Gerhard * Modern Computer Arithmetic by Brent and Zimmermann * Handbook of Floating-Point Arithmetic by Muller, Brisebarre, de Dinechin, et al. * Computer Arithmetic: Algorithms and Hardware Designs by Behrooz * Synthesis of Arithmetic Circuits: FPGA, ASIC and Embedded Systems by Deschamps, Bioul, and Sutter * Hardware Implementation of Finite-Field Arithmetic by Deschamps, Imana, Sutter Mathematics Try to avoid books directly targeting CS majors and/or with titles like "Discrete Math" as they tend to teach next to nothing. * Introduction to Number Theory by Hardy and Wright * Combinatorics and Graph Theory by Harris, Hirst, and Mossinghoff * Combinatorics: Topics, Techniques, Algorithms by Cameron * All of Statistics: A Concise Course in Statistical Inference by Wasserman * Probability Models by Sheldon Ross * Signals and Systems by Oppenheim * Discrete-Time Signal Processing by Oppenheim * Analytic Combinatorics by Flajolet and Sedgewick (follow up to their algorithm book) * Quaternions and Rotation Sequences: A Primer with Applications to Orbits, Aerospace, and Virtual Reality by Kuipers see also Math Textbook Recommendations Quantum Computing No, quantum computers won't magically be all powerful and able to solve all the world's problems nor is it a sure fire way of solving all the problems in NP but it's still a very interesting and rapidly developing field. You don't need thoroughly study all of the material in Sakurai, Shankar, or Griffiths' Quantum Mechanics texts to read about Quantum Computing but you do obviously need some understanding of QM. The following books will give you all the understanding of what Quantum Mechanics means that you always wanted to know - and if you happen to be a physics student or autodidact, probably never got in Sakurai, Shankar, or Griffiths' books or in the all too common "shut up and calculate!" lectures making them more than worthwhile to study and appreciate even with a QM background as well. * Quantum Theory: Concepts and Methods by Peres (Covers most of the material you need to know to move into QC) * Speakable and Unspeakable in Quantum Mechanics: Collected Papers on Quantum Philosophy by Bell * Quantum Theory by David Bohm (Insight into the relationship between classical mechanics and quantum theory) If your interested in learning more about physics and QM see the Physics Textbook Recommendations * An Introduction to Quantum Computing by Kaye, Laflamme, and Mosca * Classical and Quantum Computation by Kitaev, Shen and Vyalyi * Quantum Computation and Quantum Information by Michael Nielsen and Isaac Chuang (The book and reference on QC) * Quantum Computing: A Short Course From Theory To Experiment by Stolze and Suter (More on the Quantum Engineering side and requires a strong physics background) OS Development * Linux Kernel Development by Love * Linux Device Drivers by Corbet, Rubini, and Kroah-Hartman * Understanding the Linux Kernel by Bovet and Cesati * The Design of the UNIX Operating System by Bach * The Design and Implementation of the FreeBSD Operating System by McKusick, Neville-Neil, and Watson * Windows® Internals by Russinovich, Solomon, and Ionescu (For when fate forces you to deal with Windows) Software Engineering, Development, and Project Management * The Mythical Man-Month: Essays on Software Engineering by Brooks * Code Complete: A Practical Handbook of Software Construction by McConnell * Design Patterns: Elements of Reusable Object-Oriented Software by Gamma, Helm, Johnson, and Vlissides (Gang of Four book) * Software Requirements and Specifications: A Lexicon of Practice, Principles and Prejudices by Jackson * Working Effectively with Legacy Code by Feathers * The Pragmatic Programmer by Hunt and Thomas * Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin * Refactoring: Improving the Design of Existing Code by Fowler * Peopleware: Productive Projects and Teams by DeMarco and Lister Databases * An Introduction to Database Systems by Date * Database Management Systems by Ramakrishnan and Gehrke * Readings in Database Systems by Hellerstein and Stonebraker * Transaction Processing: Concepts and Techniques by Gray and Reuter * Transactional Information Systems: Theory, Algorithms, and the Practice of Concurrency Control and Recovery by Weikum and Vossen Distributed Systems and Computing * Distributed Systems: Principles and Paradigms by Tanenbaum and van Steen * Distributed Systems by Mullender * Distributed Algorithms by Lynch * Introduction to Distributed Algorithms by Tel Miscellaneous References * Hacker's Delight by Warren * Programming Pearls by Bentley * Structure and Interpretation of Computer Programs by Abelson and Sussman (Known as SICP) * Association of Computing Machinery (ACM) and IEEE Computer Society's joint undergraduate curricula guidelines and recommendations for Computer Science and Computer Engineering (For comparing what you know with what you should know)